package com.wuhenzhizao.sku.use;


import android.app.Dialog;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.widget.Toast;

import com.wuhenzhizao.sku.R;
import com.wuhenzhizao.sku.bean.Product;
import com.wuhenzhizao.sku.bean.Sku;
import com.wuhenzhizao.sku.bean.SkuAttribute;
import com.wuhenzhizao.sku.databinding.DialogProductSkuBinding;
import com.wuhenzhizao.sku.use.image.GImageLoader;
import com.wuhenzhizao.sku.use.utils.NumberUtils;
import com.wuhenzhizao.sku.view.OnSkuListener;
import com.wuhenzhizao.titlebar.utils.AppUtils;

import java.util.List;

/**
 * Created by liufei on 2017/11/30.
 */
public class ProductSkuDialog extends Dialog {
	private DialogProductSkuBinding binding;
	private Context context;
	private Product product;  // 后台返回的json字符串
	private List<Sku> skuList;  // 后台返回json字符串，获取其中的规格的数据，本地存储的。
	private Callback callback;

	private Sku selectedSku;  // 选中的规格的商品的信息
	private String priceFormat;
	private String stockQuantityFormat;

	public ProductSkuDialog(@NonNull Context context) {
		this(context, R.style.CommonBottomDialogStyle);
	}

	public ProductSkuDialog(@NonNull Context context, @StyleRes int themeResId) {
		super(context, themeResId);
		this.context = context;
		initView();
	}

	private void initView() {
		binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.dialog_product_sku, null, false);
		setContentView(binding.getRoot());

		binding.ibSkuClose.setOnClickListener(new View.OnClickListener() { // 关闭dialog
			@Override
			public void onClick(View v) {
				dismiss();
			}
		});
		binding.btnSkuQuantityMinus.setOnClickListener(new View.OnClickListener() { // 数量减
			@Override
			public void onClick(View v) {
				String quantity = binding.etSkuQuantityInput.getText().toString();
				if (TextUtils.isEmpty(quantity)) {
					return;
				}
				int quantityInt = Integer.parseInt(quantity);
				if (quantityInt > 1) {
					String newQuantity = String.valueOf(quantityInt - 1);
					binding.etSkuQuantityInput.setText(newQuantity);
					binding.etSkuQuantityInput.setSelection(newQuantity.length());
					updateQuantityOperator(quantityInt - 1);
				}
			}
		});
		binding.btnSkuQuantityPlus.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {   // 数量加
				String quantity = binding.etSkuQuantityInput.getText().toString();
				if (TextUtils.isEmpty(quantity) || selectedSku == null) {
					return;
				}
				int quantityInt = Integer.parseInt(quantity);
				if (quantityInt < selectedSku.getStockQuantity()) {
					String newQuantity = String.valueOf(quantityInt + 1);
					binding.etSkuQuantityInput.setText(newQuantity);
					binding.etSkuQuantityInput.setSelection(newQuantity.length());
					updateQuantityOperator(quantityInt + 1);
				}
			}
		});
		binding.etSkuQuantityInput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
			@Override
			public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {   // 手动输入数字
				if (actionId != EditorInfo.IME_ACTION_DONE || selectedSku == null) {
					return false;
				}
				String quantity = binding.etSkuQuantityInput.getText().toString();
				if (TextUtils.isEmpty(quantity)) {
					return false;
				}
				int quantityInt = Integer.parseInt(quantity);
				if (quantityInt <= 1) {
					binding.etSkuQuantityInput.setText("1");
					binding.etSkuQuantityInput.setSelection(1);
					updateQuantityOperator(1);
				} else if (quantityInt >= selectedSku.getStockQuantity()) {
					String newQuantity = String.valueOf(selectedSku.getStockQuantity());
					binding.etSkuQuantityInput.setText(newQuantity);
					binding.etSkuQuantityInput.setSelection(newQuantity.length());
					updateQuantityOperator(selectedSku.getStockQuantity());
				} else {
					binding.etSkuQuantityInput.setSelection(quantity.length());
					updateQuantityOperator(quantityInt);
				}
				return false;
			}
		});

		binding.scrollSkuList.setListener(new OnSkuListener() {  //  规格的监听
			@Override
			public void onUnselected(SkuAttribute unselectedAttribute) { // 取消选中
				selectedSku = null;
				GImageLoader.displayUrl(context, binding.ivSkuLogo, product.getMainImage()); // 加载主缩略图
				binding.tvSkuQuantity.setText(String.format(stockQuantityFormat, product.getStockQuantity())); // 设置主库存数量
				String firstUnselectedAttributeName = binding.scrollSkuList.getFirstUnelectedAttributeName(); // 若，第一个规格没有数据，则直接显示其规格名称
				binding.tvSkuInfo.setText("请选择：" + firstUnselectedAttributeName); // 设置描述
				binding.btnSkuSubmit.setEnabled(false);    //设置确定按钮不可提交
				String quantity = binding.etSkuQuantityInput.getText().toString();   // 购买的商品数量
				if (!TextUtils.isEmpty(quantity)) {
					updateQuantityOperator(Integer.valueOf(quantity));// 商品的个数
				} else {
					updateQuantityOperator(0);
				}
			}

			@Override
			public void onSelect(SkuAttribute selectAttribute) {  // 点击选中规格
				String firstUnselectedAttributeName = binding.scrollSkuList.getFirstUnelectedAttributeName();
				binding.tvSkuInfo.setText("请选择：" + firstUnselectedAttributeName);
			}

			@Override
			public void onSkuSelected(Sku sku) { // 点击规格item后，sku返回相应的规格的数据
				selectedSku = sku;
				GImageLoader.displayUrl(context, binding.ivSkuLogo, selectedSku.getMainImage());  // 加载此规格的数据的图片
				List<SkuAttribute> attributeList = selectedSku.getAttributes(); // 获取规格的信息
				StringBuilder builder = new StringBuilder();  // 描述的textView 中描述使用多个规格进行拼接描述。循环获取
				for (int i = 0; i < attributeList.size(); i++) {
					if (i != 0) {
						builder.append("　");
					}
					SkuAttribute attribute = attributeList.get(i);
					builder.append("\"" + attribute.getValue() + "\"");  // 获取规格值
				}
				binding.tvSkuInfo.setText("已选：" + builder.toString()); // 设置描述，已选 xxx规格 xx规格
				binding.tvSkuQuantity.setText(String.format(stockQuantityFormat, selectedSku.getStockQuantity())); // 获取此规格的库存，设置出来
				binding.btnSkuSubmit.setEnabled(true);// 设置确定可以点击
				String quantity = binding.etSkuQuantityInput.getText().toString(); // 获取此商品的要购买的数量
				if (!TextUtils.isEmpty(quantity)) {  // 如果库存是不为空，则进行判断，一些按钮是否可以点击
					updateQuantityOperator(Integer.valueOf(quantity));
				} else {
					updateQuantityOperator(0);
				}
			}
		});

		binding.btnSkuSubmit.setOnClickListener(new View.OnClickListener() {  // 确定按钮的点击事件
			@Override
			public void onClick(View v) {
				String quantity = binding.etSkuQuantityInput.getText().toString(); // 获取购买的数量
				if (TextUtils.isEmpty(quantity)) {
					return;
				}
				int quantityInt = Integer.parseInt(quantity);
				if (quantityInt > 0 && quantityInt <= selectedSku.getStockQuantity()) { // 0<购买的数量<=库存量
					callback.onAdded(selectedSku, quantityInt);  // 回到返回选中的item 的规格的信息 和 购买的数量
					dismiss(); // 关闭popwindow
				} else {
					Toast.makeText(getContext(), "商品数量超出库存，请修改数量", Toast.LENGTH_SHORT).show();
				}
			}
		});
	}

	/**
	 * 后台接收到数据后填充数据
	 *
	 * @param product  后台返回的数据
	 * @param callback 点击确定后，需要购买的商品的信息和数量的回调
	 */
	public void setData(final Product product, Callback callback) {  // 设置填充的数据
		this.product = product;
		this.skuList = product.getSkus();
		this.callback = callback;

		priceFormat = context.getString(R.string.comm_price_format);  // 获取库存string，含有占位符 ，需要设置
		stockQuantityFormat = context.getString(R.string.product_detail_sku_stock); //获取价格 string，含有占位符，需要设置

		updateSkuData();  // 更新数据
		updateQuantityOperator(1); //  更新一些按钮的操作
	}

	/**
	 * 设置默认的选中的 第一个数据。设置相关的信息
	 */
	private void updateSkuData() {
		binding.scrollSkuList.setSkuList(product.getSkus());  //  将数据设置到 规格控件中

		Sku firstSku = product.getSkus().get(0); // 获取后台返回的数据规格数组中第一个数据
		if (firstSku.getStockQuantity() > 0) { // 如果第一条数据中库存>0
			selectedSku = firstSku;   //设置这个数据为选中的规格的数据
			// 选中第一个sku
			binding.scrollSkuList.setSelectedSku(selectedSku);// 设置默认的选中的规格

			GImageLoader.displayUrl(context, binding.ivSkuLogo, selectedSku.getMainImage()); // 加载默认选中的缩略图
			binding.tvSkuSellingPrice.setText(String.format(priceFormat, NumberUtils.formatNumber(selectedSku.getSellingPrice() / 100))); // 设置选中的价格
			binding.tvSkuSellingPriceUnit.setText("/" + product.getMeasurementUnit());// 设置卖出去多少
			binding.tvSkuQuantity.setText(String.format(stockQuantityFormat, selectedSku.getStockQuantity())); // 设置库存
			binding.btnSkuSubmit.setEnabled(selectedSku.getStockQuantity() > 0); // 如果库存》0  确定可以点击
			List<SkuAttribute> attributeList = selectedSku.getAttributes();  // 获取选中的 规格数组
			StringBuilder builder = new StringBuilder();
			for (int i = 0; i < attributeList.size(); i++) {
				if (i != 0) {
					builder.append("　");
				}
				SkuAttribute attribute = attributeList.get(i);
				builder.append("\"" + attribute.getValue() + "\"");
			}
			binding.tvSkuInfo.setText("已选：" + builder.toString());  // 设置描述的信息
		} else {  // 如果第一个规格的数据中的库存为 0
			GImageLoader.displayUrl(context, binding.ivSkuLogo, product.getMainImage());
			binding.tvSkuSellingPrice.setText(String.format(priceFormat, NumberUtils.formatNumber(product.getSellingPrice() / 100)));
			binding.tvSkuSellingPriceUnit.setText("/" + product.getMeasurementUnit());
			binding.tvSkuQuantity.setText(String.format(stockQuantityFormat, product.getStockQuantity())); // 设置默认的库存是总的数据的库存
			binding.btnSkuSubmit.setEnabled(false); // 确定不可以点击
			binding.tvSkuInfo.setText("请选择：" + skuList.get(0).getAttributes().get(0).getKey()); // 设置描述为这个xx规格下xx型号的规格组名
		}
	}

	/**
	 * 根据数量进行判断，按钮是否可以点击
	 *
	 * @param newQuantity 数量框内的数量
	 */
	private void updateQuantityOperator(int newQuantity) {
		if (selectedSku == null) {  // 如果填充的数据是空的，- + 数量edit都不可用
			binding.btnSkuQuantityMinus.setEnabled(false);
			binding.btnSkuQuantityPlus.setEnabled(false);
			binding.etSkuQuantityInput.setEnabled(false);
		} else {
			if (newQuantity <= 1) {  // 如果数量<=1,则只可以增加+ ，不可以减少-
				binding.btnSkuQuantityMinus.setEnabled(false);
				binding.btnSkuQuantityPlus.setEnabled(true);
			} else if (newQuantity >= selectedSku.getStockQuantity()) { // 如果购买的数量>= 库存量 ，则只可以减- ，不能再购买
				binding.btnSkuQuantityMinus.setEnabled(true);
				binding.btnSkuQuantityPlus.setEnabled(false);
			} else {                                                   // 其他的情况+- 正常的可以点击
				binding.btnSkuQuantityMinus.setEnabled(true);
				binding.btnSkuQuantityPlus.setEnabled(true);
			}
			binding.etSkuQuantityInput.setEnabled(true);
		}

	}

	@Override
	public void onAttachedToWindow() {
		super.onAttachedToWindow();
		// 解决键盘遮挡输入框问题
		Window window = getWindow();
		window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
		window.setGravity(Gravity.BOTTOM);
		window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
		window.getDecorView().setPadding(0, 0, 0, 0);
		// KeyboardConflictCompat.assistWindow(getWindow());
		AppUtils.transparencyBar(getWindow());
	}


	public interface Callback {
		void onAdded(Sku sku, int quantity);
	}
}
